package com.hexacta.hrs.services.employee;

import java.util.Calendar;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.Set;

import org.vectrics.employee.Employee;
import org.vectrics.employee.MedicalInsurance;
import org.vectrics.user.Person;
import org.vectrics.user.User;

import com.hexacta.hrs.services.employee.impl.EmploymentConditionDTO;

/**
 * El servicio de {@link Employee}.
 * 
 * @author mfunes
 */
public interface EmployeeService {

    /**
     * Devuelve una coleccion de todos los employees.
     * 
     * @return todos los {@link Employee}s
     */
    Collection<Employee> getAll();

    /**
     * Devuelve una coleccion de todos los employees en relaci�n de dependencia
     * 
     * @return todos los {@link Employee}s en relaci�n de dependencia
     */
    Collection<Employee> getEmployeesOnly();

    /**
     * Obtiene el {@link Employee} con el id especificado.
     * 
     * @param id
     *            el id del {@link Employee}
     * @return el {@link Employee} con el id especificado
     */
    Employee searchById(Long id);

    /**
     * Obtiene todos los empleados cuya DateEnd.
     * 
     * @return
     */
    Collection<Employee> getNoLongerEmployees();

    List<MedicalInsurance> getEmployeesMedicalInsurance();

    /**
     * Obtiene todos los empleados cuya DateEnd.
     * 
     * @return
     */
    Collection<Employee> getEmployeesBetweenDates(Date dateFrom, Date dateTo);

    /**
     * Obtiene el {@link Employee} con el usuario especificado.
     * 
     * @param user
     * @return
     */
    Employee searchBy(User user);

    /**
     * Guarda Modificaciones del empleado
     * 
     * @param employee
     */
    void update(Employee employee);

    /**
     * Busca al empleado que contenga a la persona pasada por parametro.
     * 
     * @param person
     * @return
     */
    Employee searchByPerson(Person person);

    /**
     * Devuelve las condiciones de empleo actuales correspondientes al empleado
     * especificado.
     * 
     * @param employee
     *            Employee con el empleado del cual obtener la condici�n de
     *            empleo.
     * @return EmploymentConditionDTO con las condiciones de empleo.
     */
    EmploymentConditionDTO getCurrentEmploymentCondition(Employee employee);

    /**
     * Devuelve todas las condiciones de empleo del empleado especificado.
     * 
     * @param employee
     *            Employee con el empleado del cual obtener la condici�n de
     *            empleo.
     * @return Set<EmploymentConditionDTO> con el conjunto de todas las
     *         condiciones de empleo.
     */
    Set<EmploymentConditionDTO> getEmploymentConditionHistory(Employee employee);

    /**
     * Borra el empleado
     * 
     * @param employee
     */
    void remove(Employee employee);

    /**
     * Obtiene todos los empleados que trabajan actuamente en la emmpresa.
     * 
     * @return la lista de empleados actuales.
     */
    Collection<Employee> getAllCurrentEmployees();

    /**
     * Obtiene todos los empleados en base al bool pasado por parametro. Si se
     * pasa true, se obtienen solo los empleados asignables a proyectos, de lo
     * contrario, se devuelven todos.
     * 
     * @return una colecci�n de empleados.
     */
    Collection<Employee> getEmployeesAssignableToProject(boolean onlyAssignableToProject);

    void save(Employee employee);

    /**
     * @return una colecci�n de empleados asignables a proyectos
     */
    Collection<Employee> getAssignableEmployees();

    /**
     * @param onlyElegibleAsProjectMember
     * @param from
     * @param to
     * @return
     */
    Collection<Employee> getEmployeesAssignableToProject(boolean onlyElegibleAsProjectMember, Date from, Date to);

    /**
     * @param onlyElegibleAsProjectMember
     * @param from
     * @param to
     * @param roles
     * @return
     */
    Collection<Employee> getEmployeesAssignableToProject(boolean onlyElegibleAsProjectMember, Date from, Date to,
            String[] roles);

    // Metodos utilizados para la generaci�n de reportes

    List<Object> getEmployeesByOffice();

    List<Object> getEmployeesByGender();

    List<Object> getEmployeesMarried();

    List<Object> getEmployeesWithChildren();

    List<Object> getEmployeesByJourney();

    List<Object> getEmployeesByDegree();

    List<Object> getEmployeesBySeniorityAndArea();

    List<Object> getEmployeesBySeniorityAndGender();

    List<Object> getEmployeesByLanguage();

    List<Object> getEmployeesByEnglishLevel();

    List<Object> getEmployeesByAntiquity();

    List<Object> getEmployeesByAge();

    List<Object> getEmployeesFlow(Calendar begin, Calendar end);

    /**
     * @param begin
     * @param end
     * @return
     */
    String getEnteringEmployees(Calendar begin, Calendar end);

    /**
     * @param begin
     * @param end
     * @return
     */
    String getExitingEmployees(Calendar begin, Calendar end);

    List<Employee> getPartners();

}
